package com.my.springboot.tuling.concurrent.atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * atomic包提供了一系列的操作简单，
 * 性能高效，并能保证线程安全的类去更新基本类型变量，数组元素，引用类型以及更新对象中的
 * 字段类型。atomic包下的这些类都是采用的是乐观锁策略去原子更新数据，
 * CAS失败自旋的操作存在什么问题?
 *多个线程争夺同一个资源时，如果自旋一直不成功，将会一直占用CPU。造成内存损耗.可以让它超过一定次数或时间后强制退出,
 */
public class AtomicIntegerTest {
    static AtomicInteger sum = new AtomicInteger(0);

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(() -> {
                for (int j = 0; j < 10000; j++) {
                    // 原子自增 CAS,如果CAS失败，自旋直到成功+1
                    sum.incrementAndGet();
                    //TODO
                }
            });
            thread.start();
        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(sum.get());

    }

}
